In software development, software debugging is a well-known process for performing diagnosis of software programs to detect and reduce defects, errors, and bugs by studying relevant information about a software program and its flow of execution. However, the success of a software debugging process depends on the difficulty of the programming language of the software program being debugged as well as on the ability of the debugger (which could be a software program or an authorized person, like a software developer).
To make matters worse, today's techniques lack direct access to information necessary for performing debugging tasks and thus, they require additional software programs for collecting and providing relevant information for debugging. This not only wastes valuable resources, but also makes the debugging process slow, less efficient, and more convoluted.
For example, one conventional technique requires an extra library or function hook in a virtual machine (“VM”) to extract the necessary information for debugging. One disadvantage of this technique is that it requires building a second program to serve as an extra access mechanism to access the relevant information which leads to inefficiency as well as consumption of valuable system resources and human time and labor. In addition to an access mechanism, this technique further requires a locking mechanism to maintain a proper VM state for the VM (since the VM has to run an extra function/thread that is controlled from outside). This technique is also not a viable solution for a tracer being a low overhead and non-intrusive debugging tool and not being capable of changing states of the software program and/or virtual machine on which the program is running.
Another conventional technique requires building an additional software program to create a lookup table of those core VM structures (e.g., sizes, offsets, etc.) that are necessary for inspection while compiling a source code into a machine code at a VM. This technique is convoluted and cumbersome to use given that a software developer/programmer is required to maintain an extra description of the internal VM structure design which, in turn, requires creating an entire table of VM addresses, compiling the VM source code, and linking extra tables to the VM, and the like.